import {
  getLPermiList
} from '@/api/services/login.service'
import {
  getTabelSetData
} from '@/api/services/common.service'
import {
  removeToken
} from '@/utils/auth'
import U from '@/utils/UT'

/**
 * 线型数组转换成树型数组
 * @param {*} lineList 线型数组
 */
function lineListToTreeList(lineList) {
  lineList = lineList || [];

  // 处理成路由数据
  let list = [];
  lineList.forEach(it => {
    if (it.routeLink) {
      // let rls = it.routeLink.split('@');
      // list.push({
      //   id: it.id,
      //   num: it.mNum,
      //   sortNo: it.mSortNo,
      //   path: rls.length > 0 ? rls[0] : '',
      //   name: rls.length > 2 ? rls[2] : '',
      //   type: it.mType.key,
      //   pid: it.mPid,
      //   meta: { 
      //     title: it.mName, 
      //     icon: rls.length > 1 ? rls[1] : '', 
      //     affix: it.isAffix
      //   }
      // });

      let rls = it.routeLink.split('@');
      list.push({
        id: it.id,
        num: it.mNum,
        sortNo: it.mSortNo,
        path: rls[0],
        name: rls[1],
        type: it.mType.key,
        pid: it.mPid,
        meta: {
          title: it.mName,
          icon: it.mIcon,
          affix: it.isAffix == 1 ? true : false
        }
      });

    }
  });


  // 创建一个对象，保存页面功能
  let routeFun = {};

  // 创建一个对象，命名为map
  let map = {};

  // // 第一遍：将数据保存至map，方便根据id获取（需保证id是唯一）
  list.forEach(it => {
    if (!map[it.id]) map[it.id] = it;
  });

  // 第二遍：为了对map属性所指的对象进行处理
  list.forEach(it => {
    let pid = it.pid;
    // 过滤父级id不是0的元素
    if (pid != 0 && map[pid]) {
      if (it.type == 'SIDEBAR_MENU_GROUP' || it.type == 'SIDEBAR_MENU') { // 侧边栏
        // map[pid]为该元素的父级元素
        map[pid].children ? map[pid].children.push(it) : map[pid].children = [it];
      } else { // 页面功能
        let path = map[pid].path
        routeFun[path] ? routeFun[path].push(it) : routeFun[path] = [it];
      }
    }
  });

  // 过滤后，仅剩下根节点
  list = list.filter(it => {
    if (it.pid == 0) return it;
  });

  // 通过排序编号从小到大排序
  list.sort((a, b) => {
    return a.sortNo - b.sortNo;
  });

  return {
    sideMenuList: list,
    routeFun: routeFun
  };
}

const state = {
  sideMenuList: [], // 侧边栏菜单列表
  routeFun: {} // 路由页面功能对象{路由： 功能列表, ...}
}

// 修改-store中的对象
const mutations = {
  /**
   * 设置路由至store
   * @param sideMenuList 路由数组
   */
  SET_SIDE_MENU_LIST: (state, sideMenuList, routeFun) => {
    state.sideMenuList = sideMenuList;
    state.routeFun = routeFun;
  },
  /**
   * 清空所有侧边栏菜单列表及对应功能列表
   */
  DEL_ALL_SIDE_MENU_LIST: state => {
    state.sideMenuList = [];
    state.routeFun = {};
  }

}

// 异步分发action
const actions = {
  /**
   * 获取-侧边菜单列表并保存至store缓存
   */
  getSideMenuList({
    commit
  }) {
    const that = this;

    return new Promise((resolve, reject) => {
      getLPermiList({}).then(res => {
        // console.log('登录用户菜单权限', res);
        if (res && res.code == 1) {
          const {
            data
          } = res;
          if (!data || data.length == 0) {
            // 清除登录信息
            removeToken();

            U.qalert('<span class="c-red">管理员未为此用户分配权限，请联系其分配权限</span>', '登录提示');
          } else {
            // 处理返回数据成符合条件的数据
            let menuList = lineListToTreeList(data);
            console.log('侧边栏菜单列表', menuList);

            commit('SET_SIDE_MENU_LIST', menuList.sideMenuList, menuList.routeFun);

            resolve(res);

            // 请求接口获取所有个性设置，并把所有表格的设置保存至session缓存
            getTabelSetData({
              find: ''
            }).then(res => {
              if (res && res.code == 1) {
                let data = res.data;
                if (data && data.length > 0) {
                  data.forEach(it => {
                    // 只保存表格个性设置数据
                    if (it.tbNum.indexOf('Tb') != -1 && it.dat) {
                      let cols = JSON.parse(it.dat);

                      // 保存至缓存，方便下一次使用
                      sessionStorage.setItem(it.tbNum, JSON.stringify(cols));
                    }
                  });
                }
              }
            }).catch(error => {});
          }
        }
      }).catch(error => {
        reject(error);
      });
    });
  },
  delAllSideMenuList({
    commit,
    state
  }) {
    return new Promise(resolve => {
      commit('DEL_ALL_SIDE_MENU_LIST')
      resolve()
    })
  }

}

export default {
  namespaced: true, // 表示可以通过地址字符串形式执行actions中的方法
  state,
  mutations,
  actions
}
